﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Mvc;
using Unijovem.Domain;
using Unijovem.UI.Models;

namespace Unijovem.UI.Controllers
{
    public class MensagemController : ControllerBase<MensagemModel, Mensagem>
    {
        public ActionResult CarregarConversa(int idPessoa)
        {
            if (PessoaLogada == null)
                return Json(new { success = false, url = "http://" + Request.Url.Authority + Url.Action("Logon", "Account") }, JsonRequestBehavior.AllowGet);

            try
            {
                var conversa = SelecionarConversaUsuario(idPessoa);

                return Json(new
                {
                    success = true,
                    html = GetControlData("~/Views/Mensagem/Conversa.cshtml", conversa)
                }, JsonRequestBehavior.AllowGet);
            }
            catch (Exception)
            {
                return Json(new { success = false }, JsonRequestBehavior.AllowGet);
            }
        }

        public ActionResult MarcarConversaFechada(int idPessoa)
        {
            if (PessoaLogada == null)
                return Json(new { success = false, url = "http://" + Request.Url.Authority + Url.Action("Logon", "Account") }, JsonRequestBehavior.AllowGet);

            var mensagens = new Mensagem().SelectAllActive<Mensagem>()
               .Where(m => m.IdPessoaDestinatario == PessoaLogada.Id && m.IdPessoaRemetente == idPessoa && !m.Fechada);

            foreach (var mensagem in mensagens)
            {
                mensagem.Vista = mensagem.Fechada = true;
                mensagem.Save(mensagem);
            }

            return Json(new { success = true }, JsonRequestBehavior.AllowGet);
        }

        public ActionResult AtualizarConversa(int idPessoa)
        {
            if (PessoaLogada == null)
                return Json(new { success = false, url = "http://" + Request.Url.Authority + Url.Action("Logon", "Account") }, JsonRequestBehavior.AllowGet);

            var conversa = SelecionarConversaUsuario(idPessoa);

            return Json(new
            {
                success = true,
                html = GetControlData("~/Views/Mensagem/TextoConversa.cshtml", conversa.Mensagens)
            }, JsonRequestBehavior.AllowGet);
        }

        private ConversaModel SelecionarConversaUsuario(int idPessoa)
        {
            var conversa =
                new ConversaModel
                    {
                        IdPessoa = idPessoa,
                        NomePessoa = new Pessoa().SelectById<Pessoa>(idPessoa).NomeCompleto,
                        Mensagens = new Mensagem().SelectAll<Mensagem>()
                            .Where(m => (m.IdPessoaDestinatario == idPessoa && m.IdPessoaRemetente == PessoaLogada.Id) ||
                                        (m.IdPessoaDestinatario == PessoaLogada.Id && m.IdPessoaRemetente == idPessoa))
                            .Select(m => new MensagemModel
                                             {
                                                 DataEnvio = m.DataEnvio,
                                                 Id = m.Id,
                                                 IdPessoaDestinatario = m.IdPessoaDestinatario,
                                                 IdPessoaRemetente = m.IdPessoaRemetente,
                                                 Texto = m.Texto,
                                                 Vista = m.Vista,
                                                 PessoaDestinatario = PreencherPessoa(m.PessoaDestinatario),
                                                 PessoaRemetente = PreencherPessoa(m.PessoaRemetente)
                                             })
                    };
            return conversa;
        }

        private PessoaModel PreencherPessoa(Pessoa pessoa)
        {
            return new PessoaModel
                       {
                           Id = pessoa.Id,
                           NomeCompleto = pessoa.NomeCompleto.Split(' ').First()
                       };
        }

        public void EnviarMensagem(int idPessoa, string texto)
        {
            var mensagem = new Mensagem
                               {
                                   DataEnvio = DateTime.Now,
                                   IdPessoaDestinatario = idPessoa,
                                   IdPessoaRemetente = PessoaLogada.Id,
                                   Texto = Server.UrlDecode(texto)
                               };
            mensagem.Save(mensagem);
        }

        public ActionResult MostrarUsuariosOnline()
        {
            if (PessoaLogada == null)
                return Json(new { success = false, url = "http://" + Request.Url.Authority + Url.Action("Logon", "Account") }, JsonRequestBehavior.AllowGet);

            var pessoasOnline = new Pessoa().SelectAllActive<Pessoa>().Where(m => m.Id != PessoaLogada.Id && m.Usuario.LoginAtivo).
                        OrderByDescending(m => m.Usuario.StatusChat).ThenBy(m => m.NomeCompleto).ToList();

            try
            {
                AtualizarStatus(pessoasOnline);

                var mensagens = new Mensagem().SelectAll<Mensagem>()
                   .Where(m => m.IdPessoaDestinatario == PessoaLogada.Id && !m.Fechada)
                   .Select(m => m.IdPessoaRemetente).Distinct();

                return Json(new
                            {
                                success = true,
                                html = GetControlData("~/Views/Mensagem/UsuariosOnline.cshtml", new PessoaModel().CriarViewModel(pessoasOnline)),
                                mensagensAbertas = mensagens
                            }, JsonRequestBehavior.AllowGet);
            }
            catch (Exception)
            {
                return Json(new { success = false }, JsonRequestBehavior.AllowGet);
            }
        }

        private static void AtualizarStatus(IEnumerable<Pessoa> pessoasOnline)
        {
            foreach (var pessoa in pessoasOnline.Where(m => m.Usuario.UltimaVezOnline < DateTime.Now.AddMinutes(-3)
                                                            && m.Usuario.UltimaVezOnline > DateTime.Now.AddMinutes(-20)
                                                            && m.Usuario.StatusChat != ((int)UsuarioModel.StatusEnum.Ausente).ToString()))
            {
                pessoa.Usuario.StatusChat = ((int)UsuarioModel.StatusEnum.Ausente).ToString();
                pessoa.Usuario.Save(pessoa.Usuario);
            }

            foreach (var pessoa in pessoasOnline.Where(m => m.Usuario.UltimaVezOnline < DateTime.Now.AddMinutes(-20)
                                                            && m.Usuario.StatusChat != ((int)UsuarioModel.StatusEnum.Offline).ToString()))
            {
                pessoa.Usuario.StatusChat = ((int)UsuarioModel.StatusEnum.Offline).ToString();
                pessoa.Usuario.Save(pessoa.Usuario);
            }
        }
    }
}
